package ru.compft.common.services.impl;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import ru.compft.common.dao.SettingDao;
import ru.compft.common.data.Setting;
import ru.compft.common.services.SystemService;
import ru.compft.common.utils.GlobalConstants;
import ru.compft.common.utils.SettingConstants;

import javax.annotation.Resource;
import java.util.List;

/**
 * User: VVasiliev
 * Date: 06.08.12
 * Time: 13:17
 */
@Service
public class SystemServiceImpl implements SystemService {
    private static final Logger logger = LoggerFactory.getLogger(SystemServiceImpl.class);

    @Resource(name = "settingDao")
    private SettingDao settingDao;

//    @Resource(name = "settingCache")
//    private SettingCache settingCache;

    @Override
    public boolean isUseCache() {
        // Перечитываем системное свойство "использовать кеш" из БД всегда
        Setting setting = settingDao.getSettingByCode(SettingConstants.USE_CACHE);

        boolean result = setting != null && GlobalConstants.Y.equals(setting.getValue());
//        System.out.println("USE_CACHE = " + result);
        return result;
    }

    @Override
    public int maxRecordsPerPage() {
        Setting setting = null;
        // Преинициализация
//        preInit();

        // Если кеш проинициализирован, читаем из него, если все еще нет, читаем из DAO
//        if (settingCache.isInitialised()) {
//            setting = settingCache.getSettingByCode(SettingConstants.ROW_PER_PAGE);
//        } else {
            setting = settingDao.getSettingByCode(SettingConstants.ROW_PER_PAGE);
//        }

        int result = 0;
        if (setting != null) {
            try {
                result = Integer.parseInt(setting.getValue());
            } catch (Exception e) {
                logger.error("Property " + SettingConstants.ROW_PER_PAGE + " has incorrect value {" + setting.getValue() + "}");
            }
        }
//        System.out.println("ROW_PER_PAGE = " + result);
        return result;
    }

    @Override
    public List<Setting> getSettings(int from, int count) {
        // Преинициализация
//        preInit();

        // Если кеш проинициализирован, читаем из него, если все еще нет, читаем из DAO
//        if (settingCache.isInitialised()) {
//            return CommonUtils.getPartOfList(from, count, settingCache.getSettingList());
//        } else {
            return settingDao.getSettings(from, count);
//        }
    }

    @Override
    public int countAllSettings() {
        // Преинициализация
//        preInit();

        // Если кеш проинициализирован, читаем из него, если все еще нет, читаем из DAO
//        if (settingCache.isInitialised()) {
//            return settingCache.getSettingList().size();
//        } else {
            return settingDao.countAllSettings();
//        }
    }

    /**
     * Преинициализация кеша, если это необходимо
     */
//    private void preInit() {
//        if (isUseCache()) {
//            // Если стоит системное свойство "использовать кеш" и если кеш не проинициализирован, то инициализируем его из DAO
//            if (!settingCache.isInitialised()) {
//                settingCache.initFromList(settingDao.getAllSettings());
//            }
//        } else {
//            // очищаем кеш
//            settingCache.clearRecords();
//        }
//    }
}
